{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "637693ff",
   "metadata": {},
   "source": [
    "运行环境：jupyter notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ad14207c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import lightgbm as lgb\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "import seaborn as sns\n",
    "from sklearn import preprocessing\n",
    "import time\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b0e4d631",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>distance_from_home</th>\n",
       "      <th>distance_from_last_transaction</th>\n",
       "      <th>ratio_to_median_purchase_price</th>\n",
       "      <th>repeat_retailer</th>\n",
       "      <th>used_chip</th>\n",
       "      <th>used_pin_number</th>\n",
       "      <th>online_order</th>\n",
       "      <th>fraud</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>57.877857</td>\n",
       "      <td>0.311140</td>\n",
       "      <td>1.945940</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10.829943</td>\n",
       "      <td>0.175592</td>\n",
       "      <td>1.294219</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5.091079</td>\n",
       "      <td>0.805153</td>\n",
       "      <td>0.427715</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.247564</td>\n",
       "      <td>5.600044</td>\n",
       "      <td>0.362663</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>44.190936</td>\n",
       "      <td>0.566486</td>\n",
       "      <td>2.222767</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   distance_from_home  distance_from_last_transaction  \\\n",
       "0           57.877857                        0.311140   \n",
       "1           10.829943                        0.175592   \n",
       "2            5.091079                        0.805153   \n",
       "3            2.247564                        5.600044   \n",
       "4           44.190936                        0.566486   \n",
       "\n",
       "   ratio_to_median_purchase_price  repeat_retailer  used_chip  \\\n",
       "0                        1.945940              1.0        1.0   \n",
       "1                        1.294219              1.0        0.0   \n",
       "2                        0.427715              1.0        0.0   \n",
       "3                        0.362663              1.0        1.0   \n",
       "4                        2.222767              1.0        1.0   \n",
       "\n",
       "   used_pin_number  online_order  fraud  \n",
       "0              0.0           0.0    0.0  \n",
       "1              0.0           0.0    0.0  \n",
       "2              0.0           1.0    0.0  \n",
       "3              0.0           1.0    0.0  \n",
       "4              0.0           1.0    0.0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('card_transdata.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c078d175",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1000000, 8)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "04fa02bc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "distance_from_home不是诈骗统计：912597\n",
      "distance_from_home是诈骗统计：87403\n",
      "distance_from_last_transaction不是诈骗统计：912597\n",
      "distance_from_last_transaction是诈骗统计：87403\n",
      "ratio_to_median_purchase_price不是诈骗统计：912597\n",
      "ratio_to_median_purchase_price是诈骗统计：87403\n"
     ]
    }
   ],
   "source": [
    "print('distance_from_home不是诈骗统计：'+str(len(data.loc[(data['fraud'] == 0),'distance_from_home'])))\n",
    "print('distance_from_home是诈骗统计：'+str(len(data.loc[(data['fraud'] == 1),'distance_from_home'])))\n",
    "\n",
    "print('distance_from_last_transaction不是诈骗统计：'+str(len(data.loc[(data['fraud'] == 0),'distance_from_last_transaction'])))\n",
    "print('distance_from_last_transaction是诈骗统计：'+str(len(data.loc[(data['fraud'] == 1),'distance_from_last_transaction'])))\n",
    "\n",
    "print('ratio_to_median_purchase_price不是诈骗统计：'+str(len(data.loc[(data['fraud'] == 0),'ratio_to_median_purchase_price'])))\n",
    "print('ratio_to_median_purchase_price是诈骗统计：'+str(len(data.loc[(data['fraud'] == 1),'ratio_to_median_purchase_price'])))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ccade94a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# import matplotlib.pyplot as plt\n",
    "# import matplotlib.gridspec as gridspec\n",
    "# import seaborn as sns\n",
    "# # 特征名\n",
    "# feature_num = len(data.columns)\n",
    "# v_feat = list(data.columns)\n",
    "\n",
    "# # 构建图像\n",
    "# plt.figure(figsize=(16,feature_num*4))\n",
    "# gs = gridspec.GridSpec(feature_num, 1) \n",
    "\n",
    "# for i, cn in enumerate(data[v_feat]):\n",
    "#     ax = plt.subplot(gs[i])\n",
    "#     sns.distplot(data[cn][data[\"fraud\"] == 1], bins=50)\n",
    "#     sns.distplot(data[cn][data[\"fraud\"] == 0], bins=100)\n",
    "#     ax.set_xlabel('')\n",
    "#     ax.set_title('特征直方图: ' + str(cn))\n",
    "# plt.rcParams['font.sans-serif']=['SimHei']\n",
    "# plt.show()    # 展示图像\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4d70772f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "distance_from_home                0\n",
       "distance_from_last_transaction    0\n",
       "ratio_to_median_purchase_price    0\n",
       "repeat_retailer                   0\n",
       "used_chip                         0\n",
       "used_pin_number                   0\n",
       "online_order                      0\n",
       "fraud                             0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#缺失值检测\n",
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "939ab86b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>distance_from_home</th>\n",
       "      <th>distance_from_last_transaction</th>\n",
       "      <th>ratio_to_median_purchase_price</th>\n",
       "      <th>repeat_retailer</th>\n",
       "      <th>used_chip</th>\n",
       "      <th>used_pin_number</th>\n",
       "      <th>online_order</th>\n",
       "      <th>fraud</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [distance_from_home, distance_from_last_transaction, ratio_to_median_purchase_price, repeat_retailer, used_chip, used_pin_number, online_order, fraud]\n",
       "Index: []"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#空值属于缺失值的一种，如下图所示该数据集无空值\n",
    "\n",
    "data[data[\"distance_from_home\"] == \"\"]\n",
    "data[data[\"distance_from_last_transaction\"] == \"\"]\n",
    "data[data[\"repeat_retailer\"] == \"\"]\n",
    "data[data[\"used_chip\"] == \"\"]\n",
    "data[data[\"used_pin_number\"] == \"\"]\n",
    "data[data[\"online_order\"] == \"\"]\n",
    "data[data[\"fraud\"] == \"\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "87da718f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#空值检测\n",
    "data.duplicated().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "777bb3b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'whiskers': [<matplotlib.lines.Line2D at 0x1fb64e024c0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e02790>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e14b20>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e14df0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e2f1f0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e2f4c0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da68b0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da6b80>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65563f70>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6556f280>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557d670>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557d940>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65589d30>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65597040>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a4430>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a4700>],\n",
       " 'caps': [<matplotlib.lines.Line2D at 0x1fb64e02a90>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e02ca0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e23100>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e233d0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e2f790>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e2fa60>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da6e50>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65563160>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6556f550>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6556f820>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557dc10>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557dee0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65597310>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655975e0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a49d0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a4ca0>],\n",
       " 'boxes': [<matplotlib.lines.Line2D at 0x1fb64e021f0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e14850>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e23ee0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da65e0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65563ca0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557d3a0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65589a60>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a4160>],\n",
       " 'medians': [<matplotlib.lines.Line2D at 0x1fb64e02f70>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e236a0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e2fd30>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65563430>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6556faf0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655891f0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655978b0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655a4f70>],\n",
       " 'fliers': [<matplotlib.lines.Line2D at 0x1fb64e14550>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e23c10>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da6310>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655639d0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6557d0d0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65589790>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65597e50>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655b1550>],\n",
       " 'means': [<matplotlib.lines.Line2D at 0x1fb64e14280>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb64e23940>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb63da6040>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65563700>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb6556fdc0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655894c0>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb65597b80>,\n",
       "  <matplotlib.lines.Line2D at 0x1fb655b1280>]}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#异常值检测\n",
    "#异常值：是指数据中存在的数值明显偏离其余数据的值\n",
    "#常用的异常值检测有两种方法，一个是散点图，一个是箱线图。由于数据较多并且箱线图可以在一幅图上观察到所以特征的分布异常情况，所以我们采用箱线图观察异常值。\n",
    "\n",
    "#由下图所示，distance_from_home，distance_from_last_transaction，ratio_to_median_purchase_price中异常值较多，其余均为二分类的类别特征\n",
    "#https://blog.csdn.net/m0_59222901/article/details/124421298（箱线图介绍和用法）\n",
    "\n",
    "plt.grid(True)\n",
    "plt.boxplot(data,     #箱线图要绘制的数据\n",
    "            sym=\"g*\", #异常值的颜色和形状\n",
    "            labels=list(\"ABCDEFGH\"),  #为了便于观察，这里把特征名从左到右依次用ABCDEFGH代替\n",
    "            showmeans=True           #显示均值\n",
    "           )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d9897259",
   "metadata": {},
   "outputs": [],
   "source": [
    "#异常值的处理方法有：1.缺失，即设置为Null，适用于异常值不多；2.填补；3.删除，整行删除或成对删除；4.不处理\n",
    "#我们数据集的异常值集中在distance_from_home银行卡交易地点与家的距离，distance_from_last_transaction与上次交易发生的距离，ratio_to_median_purchase_price近一次交易与以往交易价格中位数的比率，\n",
    "#其中可能包含有用的信息，所以我们选择对异常值不进行处理\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5f257a56",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#多重共线性的分析\n",
    "## 相关关系矩阵热力图\n",
    "import seaborn as sns\n",
    "sns.heatmap(data.corr(), annot=True, cmap='RdBu', xticklabels=1, yticklabels=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f581689a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集 fraud\n",
      "0.0      903478\n",
      "1.0       86522\n",
      "dtype: int64\n",
      "测试集 fraud\n",
      "0.0      9119\n",
      "1.0       881\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd  \n",
    "\n",
    "cols = data.shape[1]\n",
    "X = data.iloc[:, 0:cols - 1]\n",
    "y = data.iloc[:, cols - 1:cols]\n",
    "\n",
    "#划分固定的训练集和测试集\n",
    "from sklearn.model_selection import train_test_split \n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01,random_state=123)\n",
    "print(\"训练集\",y_train.value_counts())\n",
    "print(\"测试集\",y_test.value_counts())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "77f14c2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "#标准化，最大限度保留异常值\n",
    "robust_scaler=preprocessing.RobustScaler()\n",
    "X_train=robust_scaler.fit_transform(X_train)\n",
    "X_test=robust_scaler.fit_transform(X_test)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "0889b2d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "高斯核训练时间： 2214.0909905433655\n"
     ]
    }
   ],
   "source": [
    "#高斯核SVM\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "\n",
    "def RBFKernelSVC(gamma=1.0):\n",
    "    return Pipeline([\n",
    "        ('std_scaler',StandardScaler()),\n",
    "        ('svc',SVC(kernel='rbf',gamma=gamma))\n",
    "    ]\n",
    "    )\n",
    "start1 = time.time()\n",
    "svc = RBFKernelSVC(gamma=1.0)\n",
    "svc.fit(X_train,y_train)\n",
    "end1 = time.time()\n",
    "print('高斯核训练时间：',end1-start1)\n",
    "  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d39aded2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "高斯核测试时间： 14.702925443649292\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.model_selection import cross_val_score\n",
    "start2 = time.time()\n",
    "y_pred_test1 = svc.predict(X_test)\n",
    "end2 = time.time()\n",
    "\n",
    "print('高斯核测试时间：',end2-start2)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "75abd8e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "#多项式核SVM\n",
    "\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.preprocessing import PolynomialFeatures #导入多项式回归\n",
    "from sklearn.pipeline import Pipeline #导入python里的管道\n",
    "\n",
    "def PolynomialSVC(degree,c=10):#多项式svm\n",
    "     \n",
    "   # :param d:阶数\n",
    "    #:param C:正则化常数\n",
    "    #:return:一个Pipeline实例\n",
    "    \n",
    "    return Pipeline([\n",
    "            # 将源数据 映射到 3阶多项式\n",
    "            (\"poly_features\", PolynomialFeatures(degree=degree)),\n",
    "            # 标准化\n",
    "            (\"scaler\", StandardScaler()),\n",
    "            # SVC线性分类器\n",
    "            (\"svm_clf\", LinearSVC(C=10, loss=\"hinge\", random_state=42,max_iter=10000))\n",
    "        ])\n",
    "start3 = time.time()\n",
    "poly_svc=PolynomialSVC(degree=3)\n",
    "poly_svc.fit(X_train,y_train)\n",
    "end3 = time.time()\n",
    "print('多项式核训练时间：',end3-start3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7ad7a02f",
   "metadata": {},
   "outputs": [],
   "source": [
    "start4 = time.time()\n",
    "y_pred_test2 = poly_svc.predict(X_test)\n",
    "end4= time.time()\n",
    "print('多项式核测试时间：',end4-start4)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d63ec8e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "#模型评估(高斯核)\n",
    "###准确率\n",
    "from sklearn import metrics\n",
    "\n",
    "print('高斯核测试集准确率：',round(metrics.accuracy_score(y_test,y_pred_test1)*100,2),'%')# 预测集\n",
    "\n",
    "print('多项式核测试集准确率：',round(metrics.accuracy_score(y_test,y_pred_test2)*100,2),'%')# 预测集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "3c2f5404",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_score, recall_score, f1_score\n",
    "p = precision_score(y_test,y_pred_test1, average='binary')  # 二分零\n",
    "r = recall_score(y_test,y_pred_test1, average='binary')\n",
    "f1score = f1_score(y_test,y_pred_test1, average='binary')\n",
    "\n",
    "print('精确率是：',p)\n",
    "print('召回率是：',r)\n",
    "print('F值是：',f1score)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "77b01976",
   "metadata": {},
   "outputs": [],
   "source": [
    "#模型评估（多项式核）\n",
    "from sklearn.metrics import precision_score, recall_score, f1_score\n",
    "p1 = precision_score(y_test,y_pred_test2, average='binary')  # 二分零\n",
    "r1 = recall_score(y_test,y_pred_test2, average='binary')\n",
    "f1score1 = f1_score(y_test,y_pred_test2, average='binary')\n",
    "\n",
    "print('精确率是：',p1)\n",
    "print('召回率是：',r1)\n",
    "print('F值是：',f1score1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "cfb01bbd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.model_selection  import learning_curve\n",
    "# from sklearn.datasets import load_digits\n",
    "# from sklearn.svm import SVC\n",
    "# import matplotlib.pyplot as plt\n",
    "# import numpy as np\n",
    "\n",
    "# digits = load_digits()\n",
    "# X = digits.X_train \n",
    "# y = digits.y_train\n",
    "\n",
    "# train_sizes,train_loss, val_loss = learning_curve(\n",
    "#     svc, X, y, cv=10, scoring='neg_mean_squared_error',\n",
    "#     train_sizes=[0.1,0.25,0.5,0.75,1]  # 在整个过程中的10%取一次，25%取一次，50%取一次，75%取一次，100%取一次\n",
    "# )\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a9ff0c0b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'memory': None,\n",
       " 'steps': [('std_scaler', StandardScaler()), ('svc', SVC(gamma=1.0))],\n",
       " 'verbose': False,\n",
       " 'std_scaler': StandardScaler(),\n",
       " 'svc': SVC(gamma=1.0),\n",
       " 'std_scaler__copy': True,\n",
       " 'std_scaler__with_mean': True,\n",
       " 'std_scaler__with_std': True,\n",
       " 'svc__C': 1.0,\n",
       " 'svc__break_ties': False,\n",
       " 'svc__cache_size': 200,\n",
       " 'svc__class_weight': None,\n",
       " 'svc__coef0': 0.0,\n",
       " 'svc__decision_function_shape': 'ovr',\n",
       " 'svc__degree': 3,\n",
       " 'svc__gamma': 1.0,\n",
       " 'svc__kernel': 'rbf',\n",
       " 'svc__max_iter': -1,\n",
       " 'svc__probability': False,\n",
       " 'svc__random_state': None,\n",
       " 'svc__shrinking': True,\n",
       " 'svc__tol': 0.001,\n",
       " 'svc__verbose': False}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看当前超参数,可以看到RFR有18个超参数，但不会调节所有的\n",
    "svc.get_params()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "952fdebf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'svc__C': [1.0, 1.5, 0.5], 'svc__degree': [1, 2, 3, 4]}"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# '''\n",
    "# 使用Scikit-learn提供的RandomizedSearchCV类实现随机搜索。他需要两个参数来建立：\n",
    "# 一个估计器和超参数的可能值集，也叫参数网络或空间\n",
    "# '''\n",
    "\n",
    "# degree = [1,2,3,4]\n",
    "# svc__C = [1.0,1.5,0.5]\n",
    "# param_grid = {\n",
    "#     \"svc__C\": svc__C,\n",
    "#     \"svc__degree\": degree,\n",
    "# #     \"min_samples_split\": min_samples_split,\n",
    "# #     \"min_samples_leaf\": min_samples_leaf,\n",
    "# #     \"bootstrap\": bootstrap,\n",
    "# }\n",
    "# param_grid\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e756fb8c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best params:\n",
      "\n",
      "RandomizedSearchCV(cv=3,\n",
      "                   estimator=Pipeline(steps=[('std_scaler', StandardScaler()),\n",
      "                                             ('svc', SVC(gamma=1.0))]),\n",
      "                   n_iter=12, n_jobs=-1,\n",
      "                   param_distributions={'svc__C': [1.0, 1.5, 0.5],\n",
      "                                        'svc__degree': [1, 2, 3, 4]},\n",
      "                   scoring='r2')\n"
     ]
    }
   ],
   "source": [
    "# from sklearn.model_selection import RandomizedSearchCV\n",
    "# import time\n",
    "\n",
    "# random_cv = RandomizedSearchCV(\n",
    "#     svc, param_grid, n_iter=12, cv=3, scoring=\"r2\", n_jobs=-1\n",
    "# )\n",
    "\n",
    "# random_cv.best_params_ = random_cv.fit(X_train,y_train)\n",
    "\n",
    "\n",
    "# print('Best params:\\n')\n",
    "# print(random_cv.best_params_)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "14c80441",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
